home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / scsh-0.4 / scsh-0 / scsh-0.4.2 / scsh / userinfo1.c < prev    next >
C/C++ Source or Header  |  1995-10-22  |  2KB  |  98 lines

  1. /* Scheme48/scsh Unix system interface.
  2. ** User and group db access routines
  3. ** Copyright (c) 1993, 1994 by Olin Shivers.
  4. */
  5.  
  6. /*
  7. ** The code in this file is separated out from the code in syscalls1.c
  8. ** because we must compile them with different compiler flags (non-posix)
  9. ** to get around a NeXTSTEP bug. Once they get their act together, we can
  10. ** stick it back into syscalls1.c.
  11. */
  12.  
  13. #include <sys/types.h>
  14. #include <grp.h>
  15. #include <pwd.h>
  16.  
  17. /* Make sure our exports match up w/the implementation: */
  18. #include "userinfo1.h"
  19.  
  20. #include <unistd.h>
  21.  
  22. /* Compute the length of a null-terminated char* vector. */
  23. static int strvec_len(char **vec)    
  24. {
  25.     int i = 0;
  26.     char **ptr = vec;
  27.     if ( !ptr ) return 0;
  28.  
  29.     while( *ptr++ ) i++;
  30.  
  31.     return i;
  32.     }
  33.  
  34.  
  35. /* User db access routines
  36. *******************************************************************************
  37. */
  38.     
  39. /* Return a user name for ourself. 
  40. ** Uses our *real* uid, not our effective one.
  41. */
  42.  
  43. char *my_username(void)
  44. {
  45.     char *s = getlogin();
  46.     if( s ) return s;
  47.     else {
  48.     struct passwd *pwd = getpwuid(getuid());
  49.     return pwd ? pwd->pw_name : (char*) 0;
  50.     }
  51.     }
  52.  
  53. int user_info_uid(uid_t uid, 
  54.           char **name, gid_t *gid, char **dir, char **shell)
  55. {
  56.     struct passwd *pwd = getpwuid(uid);
  57.     if( !pwd ) return 0;
  58.     *name = pwd->pw_name;
  59.     *gid  = pwd->pw_gid;
  60.     *dir  = pwd->pw_dir;
  61.     *shell = pwd->pw_shell;
  62.     return 1;
  63.     }
  64.  
  65. int user_info_name(const char *name,
  66.            uid_t *uid, gid_t *gid, char **dir, char **shell)
  67. {
  68.     struct passwd *pwd = getpwnam(name);
  69.     if( !pwd ) return 0;
  70.     *uid  = pwd->pw_uid;
  71.     *gid  = pwd->pw_gid;
  72.     *dir  = pwd->pw_dir;
  73.     *shell = pwd->pw_shell;
  74.     return 1;
  75.     }
  76.  
  77.  
  78. int group_info_gid (int gid,  char **name, char ***members, int *nmembers)
  79. {
  80.     struct group *grp = getgrgid(gid);
  81.     if( !grp ) return 0;
  82.     *name = grp->gr_name;
  83.     *members = grp->gr_mem;
  84.     *nmembers = strvec_len(grp->gr_mem);
  85.     return 1;
  86.     }
  87.  
  88. int group_info_name (const char *name,
  89.              int *gid, char ***members, int *nmembers)
  90. {
  91.     struct group *grp = getgrnam(name);
  92.     if( !grp ) return 0;
  93.     *gid = grp->gr_gid;
  94.     *members = grp->gr_mem;
  95.     *nmembers = strvec_len(grp->gr_mem);
  96.     return 1;
  97.     }
  98.